// Package configs
// @Author: zhangdi
// @File: core
// @Version: 1.0.0
// @Date: 2023/4/21 10:15
package yaml

import (
	"sync"
)
import "github.com/spf13/viper"

// Config 代表一个通用的 kv 键值对配置读写类
type config struct {
	viper *viper.Viper
	mutex sync.Mutex
}

// NewConfig 返回一个新的 Config 实例
func newConfig() *config {
	v := viper.New()
	v.SetConfigType("yaml") // 指定配置文件格式为 YAML
	return &config{viper: v}
}

// LoadFromFile 从指定的文件中读取配置
func (c *config) LoadFromFile(filename string) error {
	c.viper.SetConfigFile(filename)
	return c.viper.ReadInConfig()
}

// Get 获取指定键名的值
func (c *config) Get(key string) interface{} {
	return c.viper.Get(key)
}

// GetString 获取指定键名的字符串值
func (c *config) GetString(key string) string {
	return c.viper.GetString(key)
}

// GetInt 获取指定键名的整数值
func (c *config) GetInt(key string) int {
	return c.viper.GetInt(key)
}

// GetBool 获取指定键名的布尔值
func (c *config) GetBool(key string) bool {
	return c.viper.GetBool(key)
}

// Set 设置指定键名的值
func (c *config) Set(key string, value interface{}) {
	// c.mutex.Lock()
	// defer c.mutex.Unlock()
	c.viper.Set(key, value)
	// 每次 set 完都同步写到文件中--异步执行
	go c.writeToFile(configPath)
}

// writeToFile 将配置写入到指定文件中（带锁保证线程安全）
func (c *config) writeToFile(filename string) error {
	c.mutex.Lock()
	defer c.mutex.Unlock()
	return c.viper.WriteConfigAs(filename)
}
